Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Rendered • View rawDownload


android/README.md v4.5.0-rc.2 (1394a44a) Text, 8.59 KB

MeshChatX Android App

This directory contains the Android app build configuration using Chaquopy to embed the Python MeshChatX server.

Architecture

The app uses a WebView to display the existing Vue.js frontend. The Python server runs in the background via Chaquopy and serves the web interface on T383838https://127.0.0.1:8000.

Build debug APK

Prerequisites:

JDK 17 or newer (required by the Android Gradle Plugin used in this project). On distributions with multiple JDKs, point the build at JDK 17+ (for example T383838JAVA_HOME for the Gradle invocation).
Android SDK with API 34 platform and Build-Tools 34 installed. Set T383838ANDROID_HOME and T383838ANDROID_SDK_ROOT to the SDK root (the same directory for both is fine).
Host build tools for wheel patching: T383838patchelf, T383838cmake, T383838pkg-config, T383838unzip, and build essentials (T383838gcc, T383838make, headers). On Arch-based systems, install T383838patchelf cmake pkgconf base-devel rustup unzip.
T383838android/vendor/ must contain the Chaquopy vendor wheels (see Updating Android Python ABI Wheels). The build fails fast if this directory is missing or incomplete.
MeshChatX Python sources at the repository root (T383838meshchatx/). The build syncs them into the app before compiling.

SDK licenses:

• Use Command-line Tools T383838sdkmanager, not the legacy T383838tools/bin/sdkmanager from old SDK layouts. The legacy tool loads JAXB classes that were removed from the JDK in Java 11, so running it on JDK 17+ fails with T383838NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema.
• Install Command-line Tools if needed: download the package for your OS from Android Studio command-line tools, extract it so you have T383838cmdline-tools/latest/bin/sdkmanager under T383838ANDROID_HOME (the inner folder is often named T383838latest; see Google’s layout for that zip).
• Accept licenses (writes under the SDK; use sudo if the SDK is root-owned):

T282828
yes Tb4b4b4| path/to/cmdline-tools/latest/bin/sdkmanager --licenses


• Install missing packages if the build still complains (platform 34, build-tools 34, etc.):

T282828
path/to/cmdline-tools/latest/bin/sdkmanager Ta5d6ff"platforms;android-34" Ta5d6ff"build-tools;34.0.0"


Build from the T383838android/ directory:

T282828
./gradlew assembleDebug

Debug APK outputs (ABI splits plus universal) are written under T383838app/build/outputs/apk/debug/, for example:

• T383838app-arm64-v8a-debug.apk
• T383838app-x86_64-debug.apk
• T383838app-armeabi-v7a-debug.apk
• T383838app-universal-debug.apk

By default all ABIs are included. To build only specific ABIs, pass a property:

T282828
./gradlew assembleDebug -PmeshchatxAbisTff7b72=armeabi-v7a
./gradlew assembleDebug -PmeshchatxAbisTff7b72=arm64-v8a,x86_64


T383838app-universal-*.apk is produced only when more than one ABI is selected.

Signing Release APKs (optional SourceStamp)

Build release APKs first:

T282828
./gradlew --no-daemon :app:assembleRelease

Create a release signing key (one time):

T282828
mkdir -p android/keystore
keytool -genkeypair -v Tffea00\
-keystore android/keystore/meshchatx-release.jks Tffea00\
-alias meshchatx-release Tffea00\
-keyalg RSA Tffea00\
-keysize T79c0ff4096 Tffea00\
-validity T79c0ff9125


Optional: create a separate SourceStamp key (recommended if you use SourceStamp):

T282828
keytool -genkeypair -v Tffea00\
-keystore android/keystore/meshchatx-stamp.jks Tffea00\
-alias meshchatx-stamp Tffea00\
-keyalg RSA Tffea00\
-keysize T79c0ff4096 Tffea00\
-validity T79c0ff9125


Sign all T383838*-unsigned.apk release artifacts:

T282828
Te6edf3ANDROID_HOMETff7b72=Ta5d6ff"Te6edf3$HOMETa5d6ff/Android/sdkTa5d6ff" Tffea00\
Te6edf3SIGNING_KEYSTORE_PATHTff7b72=android/keystore/meshchatx-release.jks Tffea00\
Te6edf3SIGNING_KEY_ALIASTff7b72=meshchatx-release Tffea00\
Te6edf3SIGNING_KEYSTORE_PASSWORDTff7b72=Ta5d6ff'<release-keystore-password>' Tffea00\
Te6edf3SIGNING_KEY_PASSWORDTff7b72=Ta5d6ff'<release-key-password>' Tffea00\
bash scripts/sign-android-apks.sh


Sign with SourceStamp enabled:

T282828
Te6edf3ANDROID_HOMETff7b72=Ta5d6ff"Te6edf3$HOMETa5d6ff/Android/sdkTa5d6ff" Tffea00\
Te6edf3SIGNING_KEYSTORE_PATHTff7b72=android/keystore/meshchatx-release.jks Tffea00\
Te6edf3SIGNING_KEY_ALIASTff7b72=meshchatx-release Tffea00\
Te6edf3SIGNING_KEYSTORE_PASSWORDTff7b72=Ta5d6ff'<release-keystore-password>' Tffea00\
Te6edf3SIGNING_KEY_PASSWORDTff7b72=Ta5d6ff'<release-key-password>' Tffea00\
Te6edf3ENABLE_SOURCESTAMPTff7b72=Tffa657true Tffea00\
Te6edf3SOURCESTAMP_KEYSTORE_PATHTff7b72=android/keystore/meshchatx-stamp.jks Tffea00\
Te6edf3SOURCESTAMP_KEY_ALIASTff7b72=meshchatx-stamp Tffea00\
Te6edf3SOURCESTAMP_KEYSTORE_PASSWORDTff7b72=Ta5d6ff'<stamp-keystore-password>' Tffea00\
Te6edf3SOURCESTAMP_KEY_PASSWORDTff7b72=Ta5d6ff'<stamp-key-password>' Tffea00\
bash scripts/sign-android-apks.sh


The helper script auto-detects the newest Android Build-Tools, runs T383838zipalign, signs with T383838apksigner, and verifies each output certificate/signature block.

Updating Android Python ABI Wheels (Python 3.11)

Use this workflow when a dependency (for example T383838cryptography) requires custom Android wheels for the ABIs listed in T383838app/build.gradle (T383838ndk.abiFilters).

For T383838armeabi-v7a, Chaquopy usually has no prebuilt NumPy wheel; T383838scripts/build-android-wheels-local.sh builds NumPy from source and must cache the official T383838chaquopy-openblas wheel (handled in the script) and run with T383838ANDROID_HOME pointing at an SDK that includes Command-line Tools and NDK 27.3.13750724 (Chaquopy’s T383838target/android-env.sh installs the NDK via T383838sdkmanager if missing).

1. Build wheels in a Podman Python 3.11 container to avoid host Python mismatches:
• Use T383838docker.io/library/python:3.11-bookworm.
• Mount project root to T383838/work and Android SDK to T383838/opt/android-sdk.
• Export T383838ANDROID_HOME and T383838ANDROID_SDK_ROOT to T383838/opt/android-sdk.
• Example container entry:
T383838podman run --rm --network host -e ANDROID_HOME=/opt/android-sdk -e ANDROID_SDK_ROOT=/opt/android-sdk -v "/opt/android-sdk:/opt/android-sdk" -v "<repo>:/work" -w /work docker.io/library/python:3.11-bookworm bash
2. Keep custom Chaquopy recipes in T383838android/chaquopy-recipes/<package>-<major>/:
• Define package/version in T383838meta.yaml.
• Store source patches in T383838patches/.
3. Build the configured ABIs with Chaquopy T383838build-wheel.py (via T383838scripts/build-android-wheels-local.sh) and place final wheels in T383838android/vendor/.
4. Update T383838android/app/build.gradle T383838pip installs to the new pinned version.
5. Rebuild with T383838./gradlew assembleDebug and verify split outputs (per enabled ABIs), including T383838app-universal-debug.apk.

Local host build example (no shell startup files required):

T282828
Tffa657cd /path/to/reticulum-meshchatX
Te6edf3ANDROID_HOMETff7b72=Ta5d6ff"Te6edf3$HOMETa5d6ff/Android/sdkTa5d6ff" Tffea00\
Te6edf3ANDROID_SDK_ROOTTff7b72=Ta5d6ff"Te6edf3$HOMETa5d6ff/Android/sdkTa5d6ff" Tffea00\
Te6edf3PYTHON_BINTff7b72=Ta5d6ff"Tff7b72$(uv python find T79c0ff3.11Tff7b72)Ta5d6ff" Tffea00\
bash scripts/build-android-wheels-local.sh --abis armeabi-v7a


If T383838uv does not have Python 3.11 yet, install it first:

T282828
uv python install T79c0ff3.11


If the wheel build fails with T383838No such file or directory: 'patchelf', install T383838patchelf and re-run the same command.

Notes:
• For Rust-backed wheels (such as modern T383838cryptography), build inside the container with Rust toolchain available.
• Keep recipe files and patches versioned; keep generated build artifacts untracked.

Custom Recipes and Patches

This project keeps Android-specific Chaquopy recipes in T383838android/chaquopy-recipes/ to bridge gaps between desktop Python dependencies and Android wheel availability.

• T383838cryptography-46
• Purpose: provide Android ABI wheels for T383838cryptography 46.0.7 for each ABI in the wheel script (for example T383838arm64-v8a, T383838x86_64, T383838armeabi-v7a) because upstream Chaquopy index only provided older builds.
• T383838patches/openssl_no_legacy.patch: disables OpenSSL legacy provider loading, which is unavailable in the bundled Android OpenSSL runtime.
• T383838patches/pyo3_no_interpreter.patch: enables compatible T383838pyo3 ABI settings for Chaquopy Python 3.11 Android builds.

• T383838aiohttp-3.13
• Purpose: align Android with desktop dependency line (T383838aiohttp 3.13.3) by building fresh ABI wheels with Chaquopy.
• No source patch is required; recipe pins the newer upstream version for Android wheel generation.

• T383838psutil-7.2
• Purpose: align Android with desktop dependency line (T383838psutil 7.2.2) while preserving Android runtime behavior.
• T383838patches/chaquopy.patch: treats T383838android platform as Linux in psutil internals and forces a safe partition enumeration path because T383838/proc/filesystems can be restricted by SELinux on some Android API levels.

• T383838bcrypt-5
• Purpose: tracks attempted upgrade path to desktop-equivalent bcrypt.
• Status: currently not enabled in Android app dependencies; T383838bcrypt==3.1.7 remains pinned for stable APK builds.

License

This directory is part of the main project licensing split:
• project-owned portions: 0BSD
• original upstream MeshChat portions: MIT

See ../LICENSE for full text and notices.


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────